/* GMRobot.hh -- Representação de um robo
 *
 * Copyright (C) 2008, Diogo F. S. Ramos <diogo.ramos@usp.br>
 * GEAR - Grupo de Estudos Avançados em Robótica
 * <http://www.sel.eesc.usp.br/gear>
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef GMROBOT_HH_
#define GMROBOT_HH_

#include <vector>
#include <string>

#include "GMClient.hh"

/** Representa um robô.

    Esta classe dever ser utilizada pela IA ou por qualquer cliente
    que queira controlar um robô.
 */
class GMRobot
{
    GMClient gm_client_;
    int id_;
    std::string end_;
public:
    /** Cria um novo objeto robô e conecta-se ao servidor GEARMedula.

        O robô é reconhecido por dois parâmentros: id e end.

        id é o que chamamos de número da camisa. end seria o nome do jogador.

        O end é utilizado pelo Hardware para controlar os
        robôs. Assim, é necessário saber qual é o nome do jogador que
        deseja-se controlar. O número da camisa pode ser
        arbitrariamente escolhido. Este, na versão atual (1.0.0), é
        utilizado pelo simulador.

        @param id Número da camisa do robô.

        @param end Nome do robô.

        @param addr Endereço do servidor GEARMedula.

        @param port Porta em que o GEARMedula esta escutando.
     */
    GMRobot( const int id, const std::string end, const std::string addr, const int port );

    ~GMRobot();

    /** Requisita a atualização do vetor field do GEARMedula.

        @return 0 em caso de sucesso.
     */
    int Read();

    /** Requisita a atualização do vetor world do GEARMedula.

        @return 0 em caso de sucesso.
    */
    int ReadWorld();

    /** Seta as velocidades frontal, lateral e de rotação do robô.

        As velocidades devem estar em metros por segundo para frontal
        e lateral e em radianos por segundo para a de rotação.

        @param vx Velocidade frontal.

        @param vy Velocidade lateral.

        @param va Velocidade de rotação.

        @return 0 em caso de sucesso.
    */
    int SetVel( const float vx, const float vy, const float va);

    /** Aciona o sistema de drible.

        @param enable true para acionar, false para o contrário.

        @return 0 em caso de sucesso.
     */
    int DribbleEnable( const bool enable );

    /** Aciona o sistema de chute.

        @param nivel Existem dois níveis. 0 para nível máximo, 1 para
        passe.

        @return 0 em caso de sucesso.
     */
    int Kick( const int nivel );
    int SayHello();

    /** Vetor field contendo as informações dos objetos dinâmicos. */
    std::vector<float> field;

    /** Vetor world contendo as informações dos objetos estáticos. */
    std::vector<float> world;
};

#endif
